package com.compmov.webservice;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

import com.compmov.datamodel.Comentario;
import com.compmov.datamodel.Persona;
import com.compmov.datamodel.Solicitud;
import com.compmov.libraries.QueryParamDictionary;
import com.google.gson.Gson;

public class SolicitudWSClient {

	private WebServiceClient webService;
	private static final String TAG = "WEBSERVICE";


	public SolicitudWSClient(String WSName) {
		super();
		webService = new WebServiceClient("/rest/"+WSName);
	}


	public SolicitudWSClient(WebServiceClient webService) {
		super();
		this.webService = webService;
	}	

	/**
	 * Envia una nueva solicitud de amistad
	 * @param solicitud	Solicitud que se desea enviar, debe contener el ID del solicitante y del solicitado
	 * @return	Una solicitud vacia si se inserto correctamente
	 * @throws WSClientException	Si existio un error se tirara una excepcion
	 */
	public Solicitud enviarSolicitud(Solicitud solicitud)throws WSClientException {
		Gson gson = new Gson();
		// Pass the parameters if needed , if not then pass dummy one as follows
		Map<String, String> params = new HashMap<String, String>();
		
		String jsonCad = new Gson().toJson(solicitud,Solicitud.class);
		params.put(QueryParamDictionary.SOLICITUD_PARAM, jsonCad);

		Log.d(TAG, "Invocando ENVIAR SOLICITUD");
		String response = webService.webPut("/enviarSolicitud", params);
		Log.d(TAG, "RESPONSE = " + response);
		try {
			WSError error = gson.fromJson(response, WSError.class);
			// Si no hay ningun error se intenta parsear el contenido de la
			// respuesta
			if (error.getError_description() == null) {
					Log.d(TAG, "INSERTADO CORRECTAMENTE");
					return new Solicitud();
			} else {
				Log.e(TAG, error + "");
				throw new WSClientException(error); 
			}
		} catch (Exception e) {
			throw new WSClientException(e);
		}
	}
	public boolean actualizarSolicitud(Solicitud solicitud)throws WSClientException {
		Gson gson = new Gson();
		// Pass the parameters if needed , if not then pass dummy one as follows
		Map<String, String> params = new HashMap<String, String>();
		String jsonCad = new Gson().toJson(solicitud,Solicitud.class);
		params.put(QueryParamDictionary.SOLICITUD_PARAM, jsonCad);
		
		Log.d(TAG, "INVOCANDO GET COMENTARIO");
		String response = webService.webPut("/actualizarSolicitud", params);			
		Log.d(TAG, "RESPONSE = " + response);
		
		try {
			WSError error = gson.fromJson(response, WSError.class);
			if (error.getError_description() == null){
				Log.d(TAG,"true");
				return true;				
			}else{
				if (error.getError_description().compareTo("Actualizacion no completada")==0){
					Log.d(TAG,"false");
					return false;
				}else{
					Log.e(TAG, error.getError_description()+"");
					throw new WSClientException(error);
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			Log.e(TAG, e.getMessage(), e);
			throw new WSClientException(e);			
		}		
	}	

	/**
	 * Retorna la lista de solicitudes pendientes que tiene una persona
	 * @param persona
	 * @return
	 * @throws WSClientException
	 */
	public List<Solicitud> getSolicitudes(Persona persona) throws WSClientException {
		
		Gson gson = new Gson();
		// Pass the parameters if needed , if not then pass dummy one as follows
		Map<String, String> params = new HashMap<String, String>();
		params.put(QueryParamDictionary.PERSONA_ID_PARAM, persona.getId().toString());
		
		Log.d(TAG, "Invocando GET SOLICITUDES");
		String response = webService.webGet("/getSolicitudesPentientes", params);
		Log.d(TAG, "RESPONSE = " + response);
		try {
			WSError error = gson.fromJson(response, WSError.class);
			// Si no hay ningun error se intenta parsear el contenido de la
			// respuesta
			if (error.getError_description() == null) {
				List<Solicitud> solicitudes = new LinkedList<Solicitud>();
				try {
					// Crear un nuevo objeto JSON de la cadena del response
					JSONObject jsonObj = new JSONObject(response);
					// Obtener todas las personas que se encuentren en el
					// arreglo persona
					JSONArray jsonSolicitud = jsonObj.optJSONArray("solicitud");
					// Se recorre cada objeto de JSON para obtener a la persona
					// como tal
					if (jsonSolicitud != null) {
						for (int i = 0; i < jsonSolicitud.length(); i++) {
							// Se crea el objeto JSON correspondiente
							JSONObject lugarJSON = jsonSolicitud.getJSONObject(i);
							// Se parsea el objeto de JSON a la clase persona y
							// se
							// agrega a la lista
							Solicitud s = gson.fromJson(
									lugarJSON.toString(), Solicitud.class);
							solicitudes.add(s);
						}

					} else {
						JSONObject jsonSolicitudObj = jsonObj
								.getJSONObject("solicitud");
						Log.d(TAG,
								"JSONSOLICITUD= " + jsonSolicitudObj.toString());
						Solicitud s = gson.fromJson(
								jsonSolicitudObj.toString(), Solicitud.class);
						if (s.getId() != 0) {
							solicitudes.add(s);
						}
					}
					for(Solicitud s:solicitudes){
						s.getSolicitado().setFotografia(WebServiceClient.getServerURL()+s.getSolicitado().getFotografia());
						s.getSolicitante().setFotografia(WebServiceClient.getServerURL()+s.getSolicitante().getFotografia());
					}
					Log.d(TAG, solicitudes + "");
					return solicitudes;
				} catch (JSONException e) {
					Log.e(TAG, e.getMessage(), e);
					throw new WSClientException(e);
				}
			} else {
				Log.e(TAG, error + "");
				throw new WSClientException(error);
			}
		} catch (Exception e) {
			Log.d(TAG, e.getMessage());
			throw new WSClientException(e);
		}
}
	
}
